package net.comfycastle.musicplayer;

import android.app.Activity;
import android.database.Cursor;
import android.os.Bundle;
import android.provider.MediaStore.Audio;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

/**
 * 앨범의 정보를 표시할 프래그먼트
 * @author ricale
 *
 */
public class InalbumInfoFragment extends BaseGeneralFragment {
	///////////
	//////////
	/////////   constant

	/** 객체 생성 당시 argument로 전달되는 bundle 객체에서 앨범 이름의 키값 */
	private static final String KEY_NAME          = "InalbumInfoFragment.keyName";
	/** 객체 생성 당시 argument로 전달되는 bundle 객체에서 앨범의 아티스트 이름의 키값 */
	private static final String KEY_TITLEARTIST   = "InalbumInfoFragment.keyTitleArtist";
	/** 객체 생성 당시 argument로 전달되는 bundle 객체에서 앨범의 아티스트가 앨범 아티스트인지(boolean)의 키값 */
	private static final String KEY_ISALBUMARTIST = "InalbumInfoFragment.keyIsAlbumArtist";
	
	///////////
	//////////
	/////////   constructor
	
	/** 앨범 아트를 불러온다. 추후 메모리 해제를 위해 변수로서 갖고 있는다. */
	private AlbumArtManager mArtManager;

	///////////
	//////////
	/////////   constructor

	/**
	 * FragInalbum의 인스턴스를 생성/반환하는 정적 메소드
	 * 인자를 받지 못하는 Fragment 클래스 생성자 대신 인자를 받는다.
	 * @param fragmentId 생성될 인스턴스의 고유 아이디
	 * @param name   앨범 이름
	 * @param artist 앨범의 아티스트
	 * @param isAA   앨범의 아티스트는 앨범 아티스트인가
	 * @return FragInalbum의 인스턴스
	 */
	public static InalbumInfoFragment newInstance(String name, String artist, boolean isAA) {
		InalbumInfoFragment instance = new InalbumInfoFragment();

		Bundle bundle = new Bundle();
		bundle.putString(KEY_NAME,          name);
		bundle.putString(KEY_TITLEARTIST,   artist);
		bundle.putBoolean(KEY_ISALBUMARTIST,isAA);
		instance.setArguments(bundle);

		return instance;
	} // end newInstance(FragmentId, String, String, boolean)
	
	///////////
	//////////
	/////////   lifecycle callback method
	
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
		View view = inflater.inflate(R.layout.inalbuminfo, container, false);
		
		String name   = getName();
		String artist = getArtist();
	    
	    Cursor cursor = getActivity().getContentResolver().query(Audio.Media.EXTERNAL_CONTENT_URI,
	    		                                                 new String[] { MPApp.TAG_ID, MPApp.TAG_DURATION, MPApp.TAG_ALBUMID },
	    		                                                 MusicUtility.makeWhere(MPApp.TAG_ALBUM, name, artist, getIsAA()),
	    		                                                 null,
	    		                                                 null);
	    
		((TextView)view.findViewById(R.id.inalbuminfo_title)).setText(name);
		((TextView)view.findViewById(R.id.inalbuminfo_artist)).setText(artist);
		
		int durations = 0;
		while(cursor != null && cursor.moveToNext()) {
			String duration = cursor.getString(cursor.getColumnIndex(MPApp.TAG_DURATION));
			durations += (int)(Integer.parseInt(duration) / 1000);
		} // end while
		((TextView)view.findViewById(R.id.inalbuminfo_tracks)).setText(cursor.getCount() + " tracks " + String.format("(%02d:%02d)", durations / 60, durations % 60));
		
		cursor.moveToFirst();
		mArtManager = new AlbumArtManager(getActivity());
		long albumId = Long.parseLong(cursor.getString(cursor.getColumnIndex(MPApp.TAG_ALBUMID)));
		mArtManager.setDelayed(false).setSize(AlbumArtManager.SIZE.MEDIUM).requestAlbumArt((ImageView)view.findViewById(R.id.inalbuminfo_albumart), albumId);
		
		return view;
	} // end onCreateView
	
	/**
	 * 액티비티에 붙었을 때 호출되는 콜백 메서드
	 */
	@Override
	public void onAttach(Activity activity) {
		super.onAttach(activity);
	}  // end onAttach
	
	/**
	 * 프래그먼트가 파괴될 때의 콜백 메서드.
	 * 앨범 아트 비트맵 메모리를 해제한다.
	 */
	@Override
	public void onDestroy() {
		super.onDestroy();
		mArtManager.release();
	} // end onDestroy
	
	///////////
	//////////
	/////////   getter
	
	/**
	 * 앨범의 이름을 리턴한다.
	 * @return 앨범 이름
	 */
	public String getName() {
		return getArguments().getString(KEY_NAME);
	} // end getName
	
	/**
	 * 앨범의 아티스트를 리턴한다.
	 * @return 앨범의 아티스트
	 */
	public String getArtist() {
		return getArguments().getString(KEY_TITLEARTIST);
	} // end getArtist
	
	/**
	 * 앨범의 아티스트가 앨범아티스트인가를 리턴한다.
	 * @return 앨범의 아티스트는 앨범아티스트인가
	 */
	public boolean getIsAA() {
		return getArguments().getBoolean(KEY_ISALBUMARTIST);
	} // end getIsAA	
} // end InalbumInfoFragment